package reflect;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * 类对象  Class的实例
 *
 * 当我们的程序使用到一个类时，JVM加载就会加载该类的.class文件，同时
 * 会实例化一个Class的实例并存入加载的类的相关信息并且每个被加载的类有
 * 且仅有一个Class的实例与之绑定。
 *
 * 反射第一步就是获取要操作的类的类对象，通过它可以反应出该类的一切信息
 * 类名，包名，属性信息，方法信息，构造器信息等等
 *
 *
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
            获取String的类对象

            获取类对象的方式主要有:
            1:类名.class
              例如:
              Class cls = String.class;
              Class cls1 = int.class;//基本类型也可以获取类对象  *基本类型只有这一种方式可以获取类对象*

            2:对象.getClass()
              Class cls = "abc".getClass();

            3:Class.forName(类的完全限定名)
              Class cls = Class.forName("java.lang.String");

            4:ClassLoader.loadClass(类的完全限定名)

         */
        //1:类名.class
//        Class cls = String.class;
//        Class cls = ArrayList.class;

        //2:Class.forName()
//        Class cls = Class.forName("java.lang.String");
//        Class cls = Class.forName("java.util.ArrayList");
        /*
            java.util.ArrayList
            java.util.HashMap
            java.io.FileInputStream
            java.lang.String
         */
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个类名");
        String className = scanner.nextLine();
        Class cls = Class.forName(className);


        //获取类的完全限定名（包名.类名）
        String name = cls.getName();
        System.out.println(name);
        //进获取类名
        name = cls.getSimpleName();
        System.out.println(name);
        /*
            Class  类对象
            它的每一个实例用于表示一个类的信息

            Package  包对象
            它的每一个实例用于表示一个包的信息
         */
        //通过类对象可以获取其表示类的包信息
        Package pack = cls.getPackage();
        System.out.println(pack.getName());
        /*
            Method 方法对象
            它的每一个实例用于表示一个方法信息
         */
        //类对象的getMethods()方法可以获取其表示的类中所有公开方法(包含从超类继承的)
        Method[] methods = cls.getMethods();
        System.out.println("一共"+methods.length+"个方法");
        for(Method method : methods){
            System.out.println(method.getName());
        }
    }
}














